package mainServer;

import interaction.BDConnection;
import interaction.BDDisconnect;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RmiServer extends DefaultServer
{
  private static final String NAME = "SpaceServer";
  private RmiServerImpl m_rmiObject;
  private boolean m_isActive = false;  
  private int m_port;
  private static Registry m_registry;
  
  public RmiServer(int port)
  {
    m_port = port; 
  }
  
  @Override
  public boolean start()
  {
    if(m_isActive == true)
    {
      System.out.println("Попытка повторного создания удалённого объекта");
      return true;
    }
    
    if(m_registry == null)
      try
      {
        m_registry = LocateRegistry.createRegistry(m_port);
      }
      catch (RemoteException e1)
      {
        System.out.println("Невозможно создать реестр объектов");
        return false;
      }
      
    try
    {
      m_rmiObject = new RmiServerImpl(this);
    }
    catch (RemoteException e)
    {
      System.out.println("Невозможно создать удалённый объект");
      return false;
      
	     
    }
    
    try
    {
      m_registry.rebind(NAME, m_rmiObject);
    }
    catch (RemoteException e)
    {
      System.out.println("Ошибка регистрации удалённого объекта");
      return false;
    }    
    
    System.out.println("Удалённый объект зарегистрирован");
    m_isActive = true;
    
    return true;
  }

  @Override
  public boolean stop()
  {
    if(m_isActive == false)
    {
      System.out.println("Попытка повторного удаления удалённого объекта");
      return true;
    }
    
    try
    {
      m_registry.unbind(NAME);
    }
    catch (RemoteException e)
    {
      System.out.println("Ошибка удалённия объекта из реестра");
      return false;
    }
    catch (NotBoundException e)
    {
      System.out.println("Удаляемый объект не находится в реестре");
      return false;
    }    
    
    System.out.println("Удалённый объект удалён из реестра");
    
    return true;
  }
  
  public Integer connect()
  {
    BDConnection tmp = new BDConnection();    
    
    return addClient(tmp);
  }
  
  public void disConnect(Integer id)
  {
    BDDisconnect tmp = new BDDisconnect();    
    
    tmp.m_clientId = id;
    removeClient(tmp);
  }
 
}
